package com.liyueheng.app.dataWarehouseDetail.behavior

import com.liyueheng.util.{ConfigLoader, SparkConf}
import org.apache.spark.sql.functions.expr

object PvPerUvRatio {
  def pvPerUvRatio(): Unit = {
    println("------------------ 分析 PV/UV 比例 -----------------")
    // 1. 获取配置信息并创建 Spark 会话
    val databaseDwd = ConfigLoader.getString("databases.dwd") // dwd 层
    val databaseDws = ConfigLoader.getString("databases.dws") // dws 层
    val appName = ConfigLoader.getString("app.name")
    val spark = SparkConf.createSparkSession(appName)

    try {
      // 2. 读取用户行为数据
      val userActDF = spark.table(s"$databaseDwd.user_act")

      // 3. 计算每日 PV/UV 比例
      val ratioDF = userActDF
        .groupBy("act_date")
        .agg(
          expr("CAST(COUNT(IF(act_type=1, user, NULL)) / COUNT(DISTINCT user) AS DECIMAL(10,2))").alias("value")
        )
        .orderBy("act_date")
        .withColumnRenamed("act_date", "name")

      // 4. 保存结果到 dws 层
      ratioDF.write.mode("overwrite").format("hive").saveAsTable(s"$databaseDws.detail_pv_per_uv")

    } finally {
      // 5. 释放资源
      SparkConf.stopSparkSession(spark)
    }
  }
}
